RCT 盲目の窓
概要
ICTSC は今年から Astro(以下ブログ)を用いてブログを構築することにした。リバースプロキシサーバとして Nginx を利用している。
なぜか Nginx 経由で繋がらないどころか blog.example.jp
でアクセスできるようにしようとしシンボリックリンクを貼ったところ起動しなくなった。リバースプロキシ経由で繋がるようにしてほしい。
前提条件
systemd
にてブログは管理している。サービス名はblog.service
である。/etc/nginx/
以下においてファイルの変更は不可だが以下の2つのファイルだけは例外である。/etc/nginx/sites-available/blog.example.jp
ファイルの編集は可能。sites-availabled/blog.example.jp
からsites-enabled/blog.example.jp
へのシンボリックリンク以外を禁止とする。(sites-enabled/blog.example.jp
のリンク解除およびファイル削除は許可する)
初期状態
bastion
から$ curl -H 'Host:blog.example.jp' 192.168.255.9
をしても応答がない。- ブログは 8080 ポートで起動しているので
curl 192.168.255.9:8080
で踏み台サーバから直接ブログへはアクセスできる。
終了状態
bastion
から$ curl -H 'Host:blog.example.jp' 192.168.255.9
をするとステータスコード200のレスポンスが返ってくる。sites-availabled
からsites-enabled
へのシンボリックリンクを貼っている。- 再起動しても blog と nginx が正しく自動起動する。
解説
Astro を用いているが特にこの技術に関しての問題ではなく。シンボリックリンクの貼り間違えと、バインドする IP を間違っていただけである。
Nginx が起動しない問題は以下で確認することができる。
$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2023-02-14 19:06:38 JST; 1min 2s ago
Docs: man:nginx(8)
Process: 299 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Feb 14 19:06:38 blog-server systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 14 19:06:38 blog-server nginx[299]: nginx: [emerg] open() "/etc/nginx/sites-enabled/blog.example.jp" failed (40: Too many lev> ←ここが原因
Feb 14 19:06:38 blog-server nginx[299]: nginx: configuration file /etc/nginx/nginx.conf test failed
Feb 14 19:06:38 blog-server systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Feb 14 19:06:38 blog-server systemd[1]: nginx.service: Failed with result 'exit-code'.
Feb 14 19:06:38 blog-server systemd[1]: Failed to start A high performance web server and a reverse proxy server.
開けないのはシンボリックリンクをミスっている(循環参照)からである
sudo ln -s ./blog.example.jp ../sites-enabled/.
修正するにはシンボリックリンクを正しく絶対パスで貼る
sudo unlink /etc/nginx/sites-enabled/blog.example.jp
sudo ln -s /etc/nginx/sites-available/blog.example.jp /etc/nginx/sites-enabled/blog.example.jp
しかしまだアクセスできない。
踏み台側
curl -H 'Host:blog.example.jp' 192.168.255.9
自分側
curl localhost:8080
blog.service を確認するとバインドする IP が間違っているためアクセスできなかったので修正
vim /etc/systemd/system/blog.service
[Unit]
Description=Blog
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/user/ictsc-blog
ExecStart=npm run start -- --port 8080 --host 192.168.255.9 ← --host を消すか 0.0.0.0 にバインドする
ExecStop=/bin/kill -WINCH ${MAINPID}
Restart=always
[Install]
WantedBy=multi-user.target
反映させることで踏み台側からアクセスできるようになる
sudo systemd daemon-reload
sudo systemd restart blog
curl -H 'Host:blog.example.jp' 192.168.255.9
また、blog.service
を変更せずに Nginx のプロキシ元を 192.168.255.9::8080
にしている場合でも正解としている。
採点基準
- 原因特定できている 25%
- 前提条件と終了条件を満たせている 75%